/******************************************************************************
 * Copyright (C) 2011 ShenZhen ComTop Information Technology Co.,Ltd
 * All Rights Reserved.
 * 本软件为深圳康拓普开发研制。未经本公司正式书面同意，其他任何个人、团体不得使用、
 * 复制、修改或发布本软件.
 *****************************************************************************/

package com.code.common.sessioncache.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

/**
 * 枚举类
 * 
 * @author 郑重
 * @since 1.0
 * @version 2010-8-25 郑重
 */
public class Enumerator implements Enumeration<String> {
    
    /**
     * Return an Enumeration over the values of the specified Collection.
     * 
     * @param collection Collection whose values should be enumerated
     */
    public Enumerator(Collection<String> collection) {
        this(collection.iterator());
    }
    
    /**
     * Return an Enumeration over the values of the specified Collection.
     * 
     * @param collection Collection whose values should be enumerated
     * @param clone true to clone iterator
     */
    public Enumerator(Collection<String> collection, boolean clone) {
        this(collection.iterator(), clone);
    }
    
    /**
     * Return an Enumeration over the values returned by the specified Iterator.
     * 
     * @param iterator Iterator to be wrapped
     */
    public Enumerator(Iterator<String> iterator) {
        super();
        this.iterator = iterator;
    }
    
    /**
     * Return an Enumeration over the values returned by the specified Iterator.
     * 
     * @param iterator Iterator to be wrapped
     * @param clone true to clone iterator
     */
    public Enumerator(Iterator<String> iterator, boolean clone) {
        super();
        if (!clone) {
            this.iterator = iterator;
        } else {
            List<String> lstAr = new ArrayList<String>();
            while (iterator.hasNext()) {
                lstAr.add(iterator.next());
            }
            this.iterator = lstAr.iterator();
        }
    }
    
    /**
     * Return an Enumeration over the values of the specified Map.
     * 
     * @param map Map whose values should be enumerated
     */
    public Enumerator(Map<?, String> map) {
        this(map.values().iterator());
    }
    
    /**
     * Return an Enumeration over the values of the specified Map.
     * 
     * @param map Map whose values should be enumerated
     * @param clone true to clone iterator
     */
    public Enumerator(Map<?, String> map, boolean clone) {
        this(map.values().iterator(), clone);
    }
    
    /**
     * The <code>Iterator</code> over which the <code>Enumeration</code> represented by this class actually operates.
     */
    private Iterator<String> iterator = null;
    
    /**
     * Tests if this enumeration contains more elements.
     * 
     * @return <code>true</code> if and only if this enumeration object contains at least one more element to provide,
     *         <code>false</code> otherwise
     */
    public boolean hasMoreElements() {
        return iterator.hasNext();
    }
    
    /**
     * Returns the next element of this enumeration if this enumeration has at least one more element to provide.
     * 
     * @return the next element of this enumeration
     * @exception NoSuchElementException if no more elements exist
     */
    public String nextElement() throws NoSuchElementException {
        return iterator.next();
    }
}